package br.unicamp.ic.mc906.kmeans;

import java.util.ArrayList;
import java.util.List;

public class Cluster<T extends KmeansInterface<T>> {
	
	private Centroide<T> centroid;
	private List<T> data;
	
	public Cluster(Centroide<T> centroid) {
		this.centroid = centroid;
		this.data = new ArrayList<T>();
	}
	
	/**
	 * Metodo para retornar o centroid do cluster
	 * @return centroid
	 */
	public Centroide<T> getCentroid() {
		return centroid;
	}
	
	/**
	 * Metodo para definir o centroid do cluster
	 * @param centroid
	 */
	public void setCentroid(Centroide<T> centroid) {
		this.centroid = centroid;
	}
	
	/**
	 * Metodo para retonar os pontos do cluster
	 * @return data
	 */
	public List<T> getData() {
		return data;
	}
	
	/**
	 * Metodo para definir os pontos do cluster
	 * @param data
	 */
	public void setData(List<T> data) {
		this.data = data;
	}
	
	/**
	 * Metodo para adicionar um novo elemento ao cluster 
	 * @param element a ser adicionado
	 */
	public void addElementToCluster(T element) {
		data.add(element);
//		Centroide<T> centroid = new Centroide(element.centroidOfCluster(this.data));
//		this.centroid = centroid;
	}
	
	/**
	 * Metodo que remove um elemento do cluster
	 * @param element a ser removido
	 * @return true caso a remocao seja feita com sucesso ou false
	 */
	public boolean removeElementFromCluster(T element) {
		boolean response = data.remove(element);
//		if(this.data.size() > 0) {
//			Centroide<T> centroid = new Centroide(element.centroidOfCluster(this.data));
//			this.centroid = centroid;
//		}
		return response;
	}
	
	/**
	 * Metodo para verificar se um elemento pertence a um cluster
	 * @param element
	 * @return true caso o elemento exista na cluster, ou false caso contrario
	 */
	public boolean contains(T element) {
		return data.contains(element);
	}
	
	
	public String toString() {
		String response = "";
		response += "----------------\n";
		response += "Centroid: "+centroid.getCenter()+"\n";
		response += "Data:\n";
		for (T element : this.data) {
			response += "\t "+element+": Distance="+element.getDistance(this.centroid.getCenter())+"\n";
		}
		
		return response;
	}

}
